其他
细节、标准与沟通——一名前端的混合开发经验
在严选基于webview+APP的混合开发模式下,前端和客户端的协作显得尤为重要。细节、标准与沟通可以说是我过去两年时间做混合开发的主要经验,本文中将从这几个方面展开,来从一个前端的角度讲述混合开发经验。
正式职能gap,注重细节:讲述我所认识到的,前端和客户端开发之间存在的gap,导致的问题以及如何解决。 重视标准建设,不以规矩,后患无穷:从严选的“黑历史”开始讲起,看看缺乏标准带来的问题,以及如何建立有效的混合开发标准。 沟通和理解是永远是合作的不二法则:要沟通、要理解,前端和客户端都是开发,需要更多的沟通和理解,这样才能在混合开发的路上共同越走越远。
2. 正视职能gap,注重细节
2.1 职能gap有哪些
前端和客户端之间的gap 专业知识带来的gap:你们前端发请求不需要手动带cookie的吗? 业务逻辑带来的gap:我们统一调底层方法去发请求的,具体逻辑要问xxx。 旧代码-祖传gap:我们以前一直这样搞的,没改过。 安卓开发和iOS开发之间的gap 系统带来的gap:你们iOS不能直接下载文件的吗,安卓都不限制的啊。 框架带来的gap:这个不行啊,我们用的那个框架限制死了,改不了。
你们底层方法大概是个啥逻辑,干了些啥事情? 看下你们旧代码是怎么搞的,具体流程是啥? 这个处理你们两端分别是怎么样的?
细到表现层 在没有权限的时候,是否会弹出授权弹窗? 如果用户已经禁止了日历权限,如何表现? 如果用户已经授权了,如何表现? 如果用户先给了授权,然后又手动关闭授权,如何表现? 如果用户先禁止授权,然后又手动开启授权,如何表现?
细到工作流程
请求的配置是哪个地址? 请求的时机和频率? 请求失败了怎么做?
怎么判断是否更新? 如果只有配置表的版本号更新,算不算更新? 如果只有单个资源的版本号更新,算不算更新,后续的资源下载会涉及哪些资源的更新?
细到异常处理
输入异常时,是否能做到一定的兼容处理; 执行异常时,是否能抛出错误,或者上报错误; 执行异常时,是否有一定的挽留措施; 大面积执行异常时,能否有及时止损的手段。
3. 重视标准建设,不以规矩,后患无穷
api标准不统一,命名、调用方式等差异较大,返回值格式也有所不同; 容易出现数个功能相近的jsbridge,造成冗余; 两端表现不一致,前端必须分开兼容。
SDK抹平差异
所有方法封装成支持回调和promise方式调用,对于原来要通过方法+事件监听调用的,则进行拼装。 通过对存在端差异每个api分别hack的方式,抹平其中的差异。
/* before */
window.NEJsbridge.call('setShareToSNSCallback', {}); // 唤起分享面板
window.onShareResult = (res) => {
// 处理分享完成
}
/* now */
invoke('setShareToSNSCallback', {}).then(([res]) => {
// 处理分享完成
})
/* before */
// 获取环境信息
if (os.isIos) {
appInfo = window.WebViewJavascriptBridge && window.WebViewJavascriptBridge.appInfo
} else {
// 注入时间问题,获取太早可能拿不到
const cb = window.NEJsbridge.invoke('appInfo', {}, function(res) {
appInfo = res;
});
if (window.NEJsbridge) {
cb();
} else {
document.addEventListener('NEJsbridgeReady', cb, false);
}
}
/* now */
invoke('appInfo').then(([res]) => {
appInfo = res;
})
对少量api设计的有问题的,重新调整其调用方式,统一调用体验。
/* before */
const cb = window.NEJsbridge.beforeExitWebView = () => { // 拦截左上角返回按钮退出
return true;
};
if (window.NEJsbridge) {
cb();
} else {
document.addEventListener('NEJsbridgeReady', cb, false);
}
/* now */
invoke('beforeExitWebView', {}, function () {
return true;
});
健全说明文档
展开后,demo的源码也可以直接看到:
3.3 定什么标准,怎么保证执行?
最重要的是流程
两端表现是否统一 异常处理是否合理 api设计是否合理
前端标准:从功能开发到使用 功能开发:上文的开发流程标准 文档建设:统一、标准的文档和示例 SDK建设:统一、标准的调用方式 调试能力:统一、标准的调试能力 客户端标准:协同标准,主要定义和前端协作相关的 流程标准:上文的开发流程 协议标准:如使用统一的协议开发jsbridge 保证实施 定接口人:前端和客户端两端各出接口人,有问题找接口人。 标准要解决开发痛点:标准首先是解决问题的,然后才是标准,只有解决了开发问题,开发才会乐于接受标准。 标准要不断更新优化:没有任何东西是一成不变的,不断更新优化才能保证有效性。 强制措施还是必须的:没有强制推动的标准很难覆盖全面,故当标准有足够的覆盖率后,需要强制措施保证其全面铺开。
4. 沟通和理解是永远是合作的不二法则
这里的沟通和理解指的前端和客户端开发之间。当然,沟通和理解是相互的,只有单方面的可能效果就差很多。
严选的前端和客户端归属不同的四级部门,因此除了需求之外交集会比较少。在这样的情况下,沟通就变得更为重要了。
专业知识、业务知识、祖传代码,任何能降低职能gap的。 技术方案,模块设计、流程设计、容灾方案,任何能保证需求质量的。 未来规划,有什么想做的,有什么能一起做的,混合开发上,本来就存在大量前端和客户端合作的机会。 当然,任何能建立友好关系的,可惜非我所长,不多加叙述。
4.2 理解什么
很多时候客户端的责任会更重,因为出问题APP挂掉可能比一个前端页面挂掉要严重,而且客户端修bug要更麻烦,不像前端能热更新。 都会遇到祖传代码,都会存在年久失修无人维护的逻辑,所以当api调不通有问题时,先彻底排查是否前端的问题,再去找客户端,客户端除了能帮你debug查日志之外,也没有特别多解决问题的办法。 都会想搞点技术项目,所以目标一定要事先对齐,否则临时强插的技术需求很难排上。 做事情都是要老板审批通过的,要干大事当然要先找对方老板。
5. 总结
本文由作者授权严选技术团队发布